type TypeA = {
  a: string;
  b: number;
}

let obj = {
  a: 123
}

// let a = TypeA<string>

/* keyof 索引的关键字*/
function getValue<T, P extends keyof T>(obj: T, key: P) {
  return obj[key]
}

//T ==> TypeA
//P ==> TypeA 里面的key
// 处理函数的时候 对象和 属性对应起来
getValue(obj, 'a');
//keyof : Q keyof TypeA:  Q: a|b

//extends  P extends keyof TypeA ==>  P extends a|b  P是a|b的子集
// extends: 在类中 继承 如果出现在泛型里面 代表的是 子集
